/**
 * 将Base64编码的字符串转换为Blob对象。
 * Blob对象用于表示二进制大型对象，可以在浏览器环境中处理大文件或二进制数据。
 * 
 * @param base64 Base64编码的字符串。
 * @param contentType 可选参数，表示生成的Blob对象的MIME类型，默认为空字符串。
 * @param sliceSize 可选参数，表示分片大小，默认为512字节。用于控制每次处理的Base64字符串长度，以优化大文件的处理。
 * @returns 返回转换后的Blob对象，如果转换失败，则返回null。
 */
export function base64ToBlob(base64: string, contentType = "", sliceSize = 512) {
    const cleanedBase64 = base64.split(",")[1] || base64;
    const fixedBase64 = cleanedBase64.replace(/-/g, "+").replace(/_/g, "/");
    const padding = "=".repeat((4 - (fixedBase64.length % 4)) % 4);
    const validBase64 = fixedBase64 + padding;

    try {
        const byteCharacters = atob(validBase64);
        const byteArrays: Uint8Array[] = [];

        // 将二进制数据分片处理，每片长度为sliceSize，创建Uint8Array数组。
        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            const slice = byteCharacters.slice(offset, offset + sliceSize);

            const byteNumbers = new Array(slice.length);
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            // 创建Uint8Array数组，用于表示二进制数据的一个片段。
            const byteArray = new Uint8Array(byteNumbers);
            byteArrays.push(byteArray);
        }

        // 创建Blob对象，包含所有的二进制数据片段，并指定MIME类型。
        return new Blob(byteArrays, { type: contentType });
    } catch (e) {
        console.error("Failed to convert base64 to blob:", e);
        return null;
    }
}


// 转blob
export function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n)
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    return new Blob([u8arr], { type: mime })
}




/**
 * 将Base64编码的字符串转换为File对象。
 * 这个函数接受一个Base64编码的字符串，一个可选的文件名和一个可选的MIME类型，
 * 并返回一个代表原始数据的File对象。
 * 
 * @param base64 Base64编码的字符串。
 * @param fileName 文件名，默认为"file.txt"。
 * @param mimeType MIME类型，默认为"text/plain"。
 * @returns 返回一个File对象，包含解码后的数据。
 */
export function base64ToFile(
    base64: string,
    fileName = "file.txt",
    mimeType = "text/plain"
): File {

    // const base64String = base64.replace(/^data:.+;base64,/, "");

    // const fixedBase64 = base64String.replace(/-/g, "+").replace(/_/g, "/");
    // const padding = "=".repeat((4 - (fixedBase64.length % 4)) % 4);
    // const validBase64 = fixedBase64 + padding;

    // const byteCharacters = atob(validBase64);

    // // 将字节序列分割成512字节的块，并将每个块转换为Uint8Array，以便创建Blob对象。
    // const byteArrays = [];

    // for (let offset = 0; offset < byteCharacters.length; offset += 512) {
    //     const slice = byteCharacters.slice(offset, offset + 512);
    //     const byteNumbers = new Array(slice.length);

    //     for (let i = 0; i < slice.length; i++) {
    //         byteNumbers[i] = slice.charCodeAt(i);
    //     }

    //     byteArrays.push(new Uint8Array(byteNumbers));
    // }

    // // 使用前面创建的字节数组块创建Blob对象。
    // const blob = new Blob(byteArrays, { type: mimeType });

    let blob = base64ToBlob(base64, mimeType);
    if (!blob) {
        throw new Error("Failed to convert base64 to blob.");
    }
    return new File([blob], fileName, { type: mimeType });
};

/**
 * 将Blob对象转换为Base64编码的字符串。
 * 这个函数接受一个Blob对象，返回一个包含Base64编码字符串的Promise。
 * @param blob Blob对象。
 * @returns 返回一个包含Base64编码字符串的Promise。
 */
export function blobToDataURI(blob: Blob): Promise<string> {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onloadend = () => resolve(reader.result as string);
        reader.onerror = reject;
        reader.readAsDataURL(blob);

        // let reader = new FileReader();
        // reader.readAsDataURL(blob);
        // reader.onload = function (e: any) {
        //     callback(e.target?.result);
        // };
    });
}
